import request from '../request.js'
import common from "../common.js"
import CosAuth from "../auth/ext/cos-auth.min.js"

let file = {}

file.uploadFiles = function(fileQueue, array = [], fileType = 'image', isOriginalName = false) {
	return new Promise((resolve, reject) => {
		request.getData('base/file/api/Upload/fileUpload', {
			// 是否原名上传
			is_original_name: isOriginalName
		}).then(res => {
			let platformType = res.data.file_storage_type
			let platformParam = res.data.param
			switch (platformType) {
				case 1:
					file.uploadFilesToServer(fileQueue, array = [], platformParam, fileType,
						isOriginalName).then(res => {
						resolve(res)
					}).catch(err => {
						reject(err)
					})
					break;
					// 阿里云存储
				case 2:
					file.uploadFilesToOss(fileQueue, array = [], platformParam, fileType,
						isOriginalName).then(res => {
						resolve(res)
					}).catch(err => {
						reject(err)
					})
					break;
					// 腾讯云存储
				case 3:
					file.uploadFilesToCos(fileQueue, array = [], platformParam, fileType,
						isOriginalName).then(res => {
						resolve(res)
					}).catch(err => {
						reject(err)
					})
					break;
			}
		})
	})
}

/**
 * OSS服务端签名后直传(支持多个文件)
 * @param {array} fileQueue 图片的本地文件列表，每一项是一个 File 对象
 * @param {array} array 已经上传成功的图片
 * @param {object} platformParam OSS服务端签名
 * @param {string} fileType 文件类型，image/video/audio仅支付宝小程序，且必填。
 * @param {boolean} isOriginalName false--随机文件名  true--原文件名
 * @date 2023-03-29
 */
file.uploadFilesToOss = function(fileQueue, array = [], platformParam = {}, fileType = 'image', isOriginalName =
	false) {
	return new Promise((resolve, reject) => {
		// 图片的本地文件列表为空，返回现有的图片数组
		if (fileQueue.length <= 0) {
			console.log('--上传完成--', array)
			resolve(array)
			// 有待上传的图片的本地文件列表
		} else {
			// 取出队列第一个元素
			let file = fileQueue.shift()

			// 文件名称
			let fileName = !isOriginalName ? platformParam.file_name + '_' + array.length + file
				.ext : file.name

			// 组合formData
			let formData = {
				OSSAccessKeyId: platformParam.access_key_id,
				key: platformParam.dir + '/' + fileName,
				policy: platformParam.policy,
				signature: platformParam.signature,
				// 让服务端返回200,不然，默认会返回204
				success_action_status: '200',
				'x-oss-security-token': platformParam.security_token
			}

			// 上传文件
			this.uploadFile(platformParam.host, file.path, platformParam.show_url_domain, formData, {},
				fileType).then(res => {
				// 上传成功
				array.push(res)

				// 重新调用方法
				this.uploadFilesToOss(fileQueue, array, platformParam, fileType,
					isOriginalName).then(res => {
					resolve(res)
				}).catch(err => {
					reject(err)
				})

			}).catch(err => {
				reject('上传文件失败')
			})
		}

	})
}

/**
 * COS服务端签名后直传(支持多个文件)
 * @param {array} fileQueue 图片的本地文件列表，每一项是一个 File 对象
 * @param {array} array 已经上传成功的图片
 * @param {object} platformParam COS服务端签名
 * @param {string} fileType 文件类型，image/video/audio仅支付宝小程序，且必填。
 * @param {boolean} isOriginalName false--随机文件名  true--原文件名
 * @date 2023-03-29
 */
file.uploadFilesToCos = function(fileQueue, array = [], platformParam = {}, fileType = 'image', isOriginalName =
	false) {
	return new Promise((resolve, reject) => {

		// 图片的本地文件列表为空，返回现有的图片数组
		if (fileQueue.length <= 0) {
			console.log('--上传完成--', array)
			resolve(array)
			// 有待上传的图片的本地文件列表
		} else {
			// 取出队列第一个元素
			let file = fileQueue.shift()

			// 文件名称
			let fileName = !isOriginalName ? platformParam.file_name + '_' + array.length + file
				.ext : file.name

			// 组合formData
			let formData = {
				'key': platformParam.dir + '/' + fileName,
				// 让服务端返回200,不然，默认会返回204
				"success_action_status": 200,
				// 'success_action_redirect': form_data.policy,
				// 'OSSAccessKeyId': form_data.accessid,
				'Signature': CosAuth({
					SecretId: platformParam.tem_secret_id,
					SecretKey: platformParam.tem_secret_key,
					Method: 'POST',
					Pathname: '/',
				}),
				'x-cos-security-token': platformParam.token,
				'Content-Type': '',
			}

			// 上传文件
			this.uploadFile(platformParam.host, file.path, platformParam.show_url_domain, formData, {},
				fileType).then(res => {
				// 上传成功
				array.push(res)
				
				// 重新调用方法
				this.uploadFilesToCos(fileQueue, array, platformParam, fileType,
					isOriginalName).then(res => {
					resolve(res)
				}).catch(err => {
					reject(err)
				})
			}).catch(err => {
				reject('上传文件失败')
			})
		}

	})
}

/**
 * 文件上传到服务器(支持多个文件  暂时没有用)
 * @param {array} fileQueue 图片的本地文件列表，每一项是一个 File 对象
 * @param {array} array 已经上传成功的图片
 * @param {object} platformParam 服务端签名
 * @param {string} fileType 文件类型，image/video/audio仅支付宝小程序，且必填。
 * @param {boolean} isOriginalName false--随机文件名  true--原文件名
 * @date 2023-03-29
 */
file.uploadFilesToServer = function(fileQueue, array = [], platformParam = {}, fileType = 'image', isOriginalName =
	false) {
	return new Promise((resolve, reject) => {
		// 图片的本地文件列表为空，返回现有的图片数组
		if (fileQueue.length <= 0) {
			console.log('--上传完成--', array)
			resolve(array)
			// 有待上传的图片的本地文件列表
		} else {
			// 取出队列第一个元素
			let file = fileQueue.shift()

			// 文件名称
			let fileName = !isOriginalName ? platformParam.file_name + '_' + array.length + file
				.ext : file.name

			// 组合formData
			let formData = {
				'key': platformParam.dir + '/' + fileName
			}

			// 上传文件
			this.uploadFile(platformParam.host, file.path, platformParam.show_url_domain, formData, {},
				fileType).then(res => {
				// 上传成功
				array.push(res)
				
				// 重新调用方法
				this.uploadFilesToServer(fileQueue, array, platformParam,
					fileType, isOriginalName).then(res => {
					resolve(res)
				}).catch(err => {
					reject(err)
				})
			}).catch(err => {
				reject('上传文件失败')
			})
		}
	})
}

/**
 * 将本地资源上传到服务器
 * @param {string} url 开发者服务器 url
 * @param {string} filePath 要上传文件资源的路径
 * @param {string} showUrlDomain 回显域名
 * @param {object} formData HTTP 请求中其他额外的 form data
 * @param {object} header HTTP 请求 Header, header 中不能设置 Referer
 * @param {string} fileType 文件类型，image/video/audio【支付宝小程序必填】
 * @date 2022-12-09
 */
file.uploadFile = function(url, filePath, showUrlDomain, formData = {}, header = {}, fileType = 'image') {
	return new Promise((resolve, reject) => {
		uni.uploadFile({
			// 开发者服务器 url【必填】
			url: url,

			// #ifdef MP-ALIPAY
			// 文件类型，image/video/audio【支付宝小程序必填】
			fileType: fileType,
			// #endif

			// 要上传文件资源的路径【必填】
			filePath: filePath,
			// 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容【必填】
			name: 'file',

			// HTTP 请求 Header, header 中不能设置 Referer
			header: header,
			// HTTP 请求中其他额外的 form data
			formData: formData,

			success: (res) => {
				console.log('--uploadFileSuccess--', res)
				/* {errMsg: 'uploadFile:ok', statusCode: 200, data: ''} */

				// 上传成功
				if (res.statusCode == 200) {
					// MP4文件，获取第一帧截屏当封面
					if (common.getSuffix(formData.key) == '.mp4' || common.getSuffix(
							formData.key) == '.MP4') {

						request.getData('base/file/api/Upload/getVideoScreenshot', {
							video_url: showUrlDomain + formData.key
						}).then(res => {
							let fileInfo = {
								video_url: res.data.video_url,
								image_url: res.data.image_url
							}
							resolve(fileInfo)
						})
					} else {
						let fileInfo = showUrlDomain + formData.key
						resolve(fileInfo)
					}
				} else {
					reject(res)
				}
			},

			fail: (err) => {
				reject(err)
			}
		})
	})
}



export default file